package cn.hnzycfc.spark.datagen.youtube.command

import cn.hnzycfc.spark.datagen.youtube.entity.CommandEntity
import com.typesafe.config.{Config, ConfigFactory}
import org.apache.commons.cli.{BasicParser, HelpFormatter, Options}
import org.apache.commons.io.FileUtils
import org.apache.log4j.Logger

import java.io.File
import scala.util.Try

/**
 * 命令行参数解析
 */
object DataGenCli {
    private val logger: Logger = Logger.getLogger(DataGenCli.getClass)
    private val config: Config = ConfigFactory.load("application.conf")

    def parse(args:Array[String]) = {

        // 每个分区的数据量
        var numPerPartition = 10000
        // 输出的位置
        var outputLocation = ""
        // 生成分区数量
        var numPartition = 10
        // 文件类型
        var fileType = "orc"

        // 参数解析（基于Apahe Common Cli)
        // 1. Definition Options Stage
        val options = new Options()
        options.addOption("n", true, "每个分区生成的数据量")
        options.addOption("o", true, "生成数据的位置")
        options.addOption("t", true, "文件类型(支持orc、csv)")
        options.addOption("p", true, "生成数据的分区数量")
        options.addOption("h", false, "帮助")

        // 2. Parsing Stage
        val parser = new BasicParser();
        val cmd = parser.parse(options, args);

        val formatter = new HelpFormatter();
        if(cmd.hasOption("h")) {
            formatter.printHelp( "YoutubeDataGen", options);
            System.exit(0)
        }

        if(cmd.hasOption("n")) {
            val num = cmd.getOptionValue("n")
            if(Try(num.toLong).isSuccess) {
                numPerPartition = num.toInt
            }
        }

        if(cmd.hasOption("t")) {
            fileType = cmd.getOptionValue("t")
        }
        logger.info(s"文件格式：$fileType")

        if(cmd.hasOption("o")) {
            outputLocation = cmd.getOptionValue("o")

            // 控制是否先删除之前配置的output
            if(config.getBoolean("app.delete.output")) {
                logger.info(s"删除之前生成的数据: ${outputLocation}")
                FileUtils.deleteQuietly(new File(outputLocation))
            }
        }
        else {
            println("请使用-o配置正确的输出位置参数.")
            formatter.printHelp( "YoutubeDataGen", options);
            System.exit(1);
        }

        if(cmd.hasOption("p")) {
            if(Try(cmd.getOptionValue("p")).isSuccess) {
                numPartition = cmd.getOptionValue("p").toInt
            }
        }

        val commandEntity = CommandEntity(numPerPartition, numPartition, fileType, outputLocation)
        logger.info("读取命令行参数成功.")
        logger.info("分区总数：" + commandEntity.numPartition)
        logger.info("每个分区生成数据总条数：" + commandEntity.numPerPartition)
        logger.info("数据输出位置：" + outputLocation)

        commandEntity
    }
}